/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.client.lineaproduccion;

import co.com.ces4.produccion.client.modales.interfaces.HasArticuloModal;
import co.com.ces4.client.baseView.CreateBase;
import co.com.ces4.produccion.client.LineaProduccionService;
import co.com.ces4.produccion.client.LineaProduccionServiceAsync;
import co.com.ces4.produccion.client.lineaproduccion.data.ArticuloLineaDS;
import co.com.ces4.produccion.client.lineaproduccion.data.ArticuloLineaRecord;
import co.com.ces4.produccion.client.modales.ArticuloModal;
import co.com.ces4.produccion.client.utils.Loader;
import co.com.ces4.produccion.jpa.entities.Articulo;
import co.com.ces4.produccion.jpa.entities.ArticuloLinea;
import co.com.ces4.produccion.jpa.entities.DetalleOrdenProduccion;
import co.com.ces4.produccion.jpa.entities.LineaProduccion;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.SelectionAppearance;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Dialog;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.ButtonItem;
import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.Layout;
import com.smartgwt.client.widgets.layout.SectionStackSection;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

/**
 *
 * @author Sebastian
 */
public class EdicionLineaProduccion extends CreateBase implements HasArticuloModal {

    private TextItem txtDescripcionLinea, txtCodigoArticulo, txtDuracionArticulo, txtDescripcionArticulo;
    private final RadioGroupItem lineaProduccionStatusRg;
    private DynamicForm frmAdministracionLinea, frmArticulos, frmResultados;
    private Button btnGuardar, btnLimpiar;
    private SectionStackSection stsAdministracionLinea;
    private SectionStackSection stsArticulos;
    private SectionStackSection stsResultados;
    private HLayout hlyAccionesAdministracionLinea;
    private LineaProduccion lineaProduccion;
    private ButtonItem btnMostrar, btnAgregar, btnEliminar;
    private ListGrid articuloLineaGrid;
    private Articulo articulo;

    public EdicionLineaProduccion() {
        super("Línea de Producción", "100%");

        stsAdministracionLinea = new SectionStackSection();

        stsAdministracionLinea.setShowHeader(false);
        stsAdministracionLinea.setCanCollapse(false);
        stsAdministracionLinea.setExpanded(true);

        frmAdministracionLinea = new DynamicForm();
        frmAdministracionLinea.setWidth100();
        frmAdministracionLinea.setNumCols(4);

        txtDescripcionLinea = new TextItem("txtDescripcionLinea", "Descripción");
        txtDescripcionLinea.setRequired(true);
        txtDescripcionLinea.setLength(50);

        lineaProduccionStatusRg = new RadioGroupItem("lineaProduccionStatus", "Estado");
        lineaProduccionStatusRg.setVertical(false);
        lineaProduccionStatusRg.setRequired(true);
        LinkedHashMap<String, String> statusOption = new LinkedHashMap<String, String>();
        statusOption.put("a", "Activo");
        statusOption.put("i", "Inactivo");
        lineaProduccionStatusRg.setValueMap(statusOption);

        btnGuardar = new Button("Guardar");
        btnGuardar.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                guardarLineaProduccion();
            }
        });
        btnLimpiar = new Button("Limpiar");
        btnLimpiar.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                frmAdministracionLinea.clearValues();
            }
        });

        hlyAccionesAdministracionLinea = new HLayout();
        hlyAccionesAdministracionLinea.setMargin(15);
        hlyAccionesAdministracionLinea.setAlign(Alignment.CENTER);
        hlyAccionesAdministracionLinea.addMember(btnGuardar);
        hlyAccionesAdministracionLinea.addMember(btnLimpiar);
        hlyAccionesAdministracionLinea.setMembersMargin(15);
        setSectionContainerItems(hlyAccionesAdministracionLinea);

        frmAdministracionLinea.setItems(txtDescripcionLinea, lineaProduccionStatusRg);
        stsAdministracionLinea.addItem(frmAdministracionLinea);
        addSection(stsAdministracionLinea);

        stsArticulos = new SectionStackSection("Articulos");
        stsArticulos.setCanCollapse(false);
        stsArticulos.setExpanded(true);

        frmArticulos = new DynamicForm();
        frmArticulos.setWidth100();
        frmArticulos.setNumCols(4);
        frmArticulos.setMargin(20);

        txtCodigoArticulo = new TextItem("txtCodigoArticulo", "Código");
        txtCodigoArticulo.setDisabled(true);
        txtCodigoArticulo.setLength(20);

        txtDescripcionArticulo = new TextItem("txtDescripcionArticulo", "Descripción");
        txtDescripcionArticulo.setDisabled(true);
        txtDescripcionArticulo.setLength(50);

        txtDuracionArticulo = new TextItem("txtDuracionArticulo", "Duración");
        txtDuracionArticulo.setDisabled(true);
        txtDuracionArticulo.setLength(11);

        btnMostrar = new ButtonItem("btnMostrar", "Seleccionar");
        btnMostrar.setStartRow(false);
        btnMostrar.setEndRow(true);
        btnMostrar.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() {

            public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent event) {
                ArticuloModal art = new ArticuloModal(EdicionLineaProduccion.this);
                art.setIsModal(true);
                art.centerInPage();
                art.show();
            }
        });

        frmArticulos.setItems(txtCodigoArticulo, txtDescripcionArticulo, txtDuracionArticulo, btnMostrar);
        stsArticulos.setItems(frmArticulos);
        addSection(stsArticulos);

        stsResultados = new SectionStackSection("Articulos de la Línea de Producción");
        stsResultados.setCanCollapse(false);
        stsResultados.setExpanded(true);

        frmResultados = new DynamicForm();
        frmResultados.setWidth100();
        frmResultados.setNumCols(4);
        frmResultados.setMargin(10);

        articuloLineaGrid = new ListGrid();
        articuloLineaGrid.setWidth100();
        articuloLineaGrid.setHeight100();
        articuloLineaGrid.setFields(ArticuloLineaRecord.getFields());
        articuloLineaGrid.setEmptyMessage("No hay registros para mostrar");
        articuloLineaGrid.setSelectionType(SelectionStyle.SIMPLE);
        articuloLineaGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);

        btnAgregar = new ButtonItem("btnAgregar", "Agregar");
        btnAgregar.setColSpan(2);
        btnAgregar.setStartRow(true);
        btnAgregar.setEndRow(false);
        btnAgregar.setAlign(Alignment.RIGHT);
        btnAgregar.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() {

            public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent event) {
                agregarArticulos();
            }
        });

        btnEliminar = new ButtonItem("btnEliminar", "Eliminar");
        btnEliminar.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() {

            public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent event) {
                final ListGridRecord[] selectedArticulos = articuloLineaGrid.getSelection();
                final List<ArticuloLinea> articulosLineas = new ArrayList<ArticuloLinea>();
                for (ListGridRecord detalleRecord : selectedArticulos) {
                    articulosLineas.add((ArticuloLinea) detalleRecord.getAttributeAsObject("detalleSolicitudProduccion"));
                }
                if (articulosLineas.isEmpty()) {
                    SC.warn("Advertencia", "Señor usuario, debe seleccionar al menos un articulo para realizar la eiminación", new BooleanCallback() {

                        @Override
                        public void execute(Boolean value) {
                        }
                    }, new Dialog());
                    return;
                }
                SC.confirm("Confirmar Desactivación", "¿Señor usuario, está seguro que desea desactivar los articulos seleccionados?", new BooleanCallback() {

                    public void execute(Boolean value) {
                        if (value) {
                            if (selectedArticulos.length > 0) {
                                for (int i = 0; i < selectedArticulos.length; i++) {
                                    articuloLineaGrid.removeData(selectedArticulos[i]);
                                }
                            }
                            //detallesSolicitudesGrid.removeSelectedData();
                            SC.say("Señor usuario, el(los) articulos seleccionado(s) fueron desactivados correctamente");
                        }
                    }
                });
            }
        });
        btnEliminar.setColSpan(2);
        btnEliminar.setStartRow(false);
        btnEliminar.setEndRow(true);
        btnEliminar.setAlign(Alignment.LEFT);

        frmResultados.setItems(btnAgregar, btnEliminar);
        stsResultados.setItems(frmResultados, articuloLineaGrid);
        addSection(stsResultados);
    }

    public EdicionLineaProduccion(final LineaProduccion lineaProduccion) {
        this();
        this.lineaProduccion = lineaProduccion;
        setSectionTitle(0, "Editar Línea de Produccion");
        txtDescripcionLinea.setValue(lineaProduccion.getDsdescripcion());
        btnLimpiar.setDisabled(true);
        if (lineaProduccion.getSnestado()) {
            lineaProduccionStatusRg.setValue("a");
        } else {
            lineaProduccionStatusRg.setValue("i");
        }

        for (ArticuloLinea articuloLinea : lineaProduccion.getArticuloLineaList()) {
            articuloLineaGrid.addData(new ArticuloLineaRecord((articuloLinea)));
        }
    }

    private void guardarLineaProduccion() {
        if (frmAdministracionLinea.validate()) {
            if (lineaProduccion == null) {
                Loader.showLoader();
                final LineaProduccion tmp = getLineaProduccion();
                AsyncCallback<LineaProduccion> registrarCallback = new AsyncCallback<LineaProduccion>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        SC.warn("Error " + caught.getMessage());
                        lineaProduccion = null;
                        Loader.hideLoader();
                    }

                    @Override
                    public void onSuccess(LineaProduccion result) {
                        lineaProduccion = tmp;
                        btnLimpiar.setDisabled(true);
                        SC.say("Señor usuario, el registro fue guardado correctamente");
                        final ConsultaLineaProduccion clp = new ConsultaLineaProduccion();
                        EdicionLineaProduccion.this.hide();
                        clp.setLayoutData("Consultar Lineas de Produccion");
                        ((Layout) EdicionLineaProduccion.this.getParentElement()).addMember(clp);
                        Loader.hideLoader();
                    }
                };
                getLineaProduccionService().guardarLinea(tmp, registrarCallback);
            } else {
                final LineaProduccion tmp = getLineaProduccion();
                AsyncCallback<Void> actualizarCallback = new AsyncCallback<Void>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        SC.warn("Error " + caught.getMessage());
                        Loader.hideLoader();
                    }

                    @Override
                    public void onSuccess(Void result) {
                        lineaProduccion = tmp;
                        SC.say("Señor usuario, el registro fue actualizado correctamente");
                        final ConsultaLineaProduccion clp = new ConsultaLineaProduccion();
                        EdicionLineaProduccion.this.hide();
                        clp.setLayoutData("Consultar Lineas de Produccion");
                        ((Layout) EdicionLineaProduccion.this.getParentElement()).addMember(clp);
                        Loader.hideLoader();
                    }
                };
                getLineaProduccionService().actualizarLinea(tmp, actualizarCallback);
            }
        }
    }

    private LineaProduccion getLineaProduccion() {
        if (lineaProduccion == null) {
            lineaProduccion = new LineaProduccion();
        }


        lineaProduccion.setDsdescripcion(txtDescripcionLinea.getValueAsString());

        if (lineaProduccionStatusRg.getValueAsString().equals("a")) {
            lineaProduccion.setSnestado(true);
        } else {
            lineaProduccion.setSnestado(false);
        }
        
        List<ArticuloLinea> articulosLineas = new ArrayList<ArticuloLinea>();
        ListGridRecord[] records = articuloLineaGrid.getRecords();
        if (records.length > 0) {
            for (int i = 0; i < records.length; i++) {
                ArticuloLinea artl = (ArticuloLinea) records[i].getAttributeAsObject("articuloLinea");
                artl.setLineaProduccion(lineaProduccion);
                articulosLineas.add(artl);
            }
        }

        lineaProduccion.setArticuloLineaList(articulosLineas);
        return lineaProduccion;
    }

    public void modalArticulo(Articulo selection) {
        if (selection != null) {
            txtCodigoArticulo.setValue(selection.getDsid());
            txtDescripcionArticulo.setValue(selection.getDsdescripcion());
            txtDuracionArticulo.setValue(selection.getNmduracion());
            articulo = selection;
        }
    }

    private void agregarArticulos() {
        if (txtCodigoArticulo.getValueAsString() != null && txtDescripcionArticulo.getValueAsString() != null) {
            ListGridRecord[] records = articuloLineaGrid.getRecords();
            Boolean existe = false;
            if (records.length > 0) {
                for (int i = 0; i < records.length; i++) {
                    if (records[i].getAttributeAsString(ArticuloLineaDS.CODIGOARTICULO).equals(articulo.getDsid())) {
                        existe = true;
                        break;
                    }
                }
            }

            if (!existe) {
                ArticuloLinea articulosLineas = new ArticuloLinea();
                articulosLineas.setArticulo(articulo);
                articulosLineas.setDetalleOrdenProduccionList(new ArrayList<DetalleOrdenProduccion>());
                articuloLineaGrid.addData(new ArticuloLineaRecord(articulosLineas));
            } else {
                SC.warn("Advertencia", "Señor usuario, el articulo ya se encuentra a la Línea de producción", new BooleanCallback() {

                    @Override
                    public void execute(Boolean value) {
                    }
                }, new Dialog());
                existe = true;
                return;
            }

        } else {
            SC.warn("Advertencia", "Señor usuario, debe seleccionar primero un articulo", new BooleanCallback() {

                @Override
                public void execute(Boolean value) {
                }
            }, new Dialog());
            return;
        }
    }

    private LineaProduccionServiceAsync getLineaProduccionService() {
        return GWT.create(LineaProduccionService.class);
    }
}
